package com.ziyucoding.springboot.labs.lab4.concurrentdemo.example.singleton;

import com.ziyucoding.springboot.labs.lab4.concurrentdemo.annoations.ThreadSafe;

/**
 * 单例模式
 * 懒汉模式：单例实例在第一次使用时进行创建
 * volatile + 双重检测机制 + 同步锁
 *
 * @author ziyucoding
 * @date 2022-10-26
 **/
@ThreadSafe
public class SingletonExample5 {

    /**
     * 单例
     * volatile + 双重检测机制 -> 禁止指令重排
     */
    private volatile static SingletonExample5 instance = null;

    private SingletonExample5() {

    }

    /**
     * 获取实例
     *
     * @param
     * @return SingletonExample5
     **/
    public static SingletonExample5 getInstance() {
        // 双重检测机制
        if (null == instance) {
            // 同步锁
            synchronized (SingletonExample5.class) {
                if (null == instance) {
                    // 1、memory = allocate() 分配对象的内存空间
                    // 2、ctorInstance() 初始化对象
                    // 3、instance = memory 设置instance指向刚分配的内存
                    instance = new SingletonExample5();
                }
            }
        }
        return instance;
    }
}
